package common.utils.file.json;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.Reader;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

import com.alibaba.fastjson.JSONReader;

import common.utils.http.HttpUtil;
import lombok.extern.slf4j.Slf4j;

/**
 * 对json 和url 解析的工具类
 * 
 * @ClassName JsonUtil
 * @author <a href="892042158@qq.com" target="_blank">于国帅</a>
 * @date 2018年5月5日 下午2:39:56
 *
 */
@Slf4j
public class JsonUtil {

    /**
     * 首先尝试jsonObject 解析 如果出现异常就用JsonArray解析
     * 
     * @Title readList
     * @author 于国帅
     * @date 2018年5月10日 下午5:45:01
     * @param reader
     * @return List<List<String>>
     */
    public static List<List<String>> readList(Reader reader) {
        List<List<String>> dataList = new ArrayList<>();
        List<String> rowList = null;
        JSONReader jsonReader = new JSONReader(reader);
        try {
            jsonReader.startObject();
            while (jsonReader.hasNext()) {
                String key = jsonReader.readString();
                String value = jsonReader.readString();
                rowList = new LinkedList<>();
                rowList.add(String.valueOf(value));
                dataList.add(rowList);
            }
            jsonReader.endObject();
        } catch (Exception e) {
            try {
                jsonReader.startArray();
                while (jsonReader.hasNext()) {
                    String value = jsonReader.readString();
                    rowList.add(String.valueOf(value));
                    dataList.add(rowList);
                }
                jsonReader.endArray();
            } catch (Exception e2) {
                // 暂时以json字符串存储
                return null;
            }
        }
        return dataList;
    }

    public static Map<String, Object> readFileMap(String fileUrl) {
        File file = new File(fileUrl);
        FileReader reader = null;
        try {
            reader = new FileReader(file);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        return readMap(reader);
    }

    public static Map<String, Object> readHttpMap(String url) {
        String content = HttpUtil.getString(url);
        StringReader stringReader = new StringReader(content);
        return readMap(stringReader);
    }

    /**
     * 解析json数据标题
     */
    public static Map<String, Object> readMap(Reader reader) {
        Map<String, Object> map = new LinkedHashMap<>();
        JSONReader jsonReader = new JSONReader(reader);
        try {
            jsonReader.startObject();
            while (jsonReader.hasNext()) {
                String key = jsonReader.readString();
                String value = jsonReader.readString();
                map.put(key, value);
            }
            jsonReader.endObject();
        } catch (Exception e) {
            jsonReader.startArray();
            while (jsonReader.hasNext()) {
                String value = jsonReader.readString();
                map.put("json1", String.valueOf(value)); // 数组统一当做json字段处理
            }
            jsonReader.endArray();

        }
        return map;
    }

    /**
     * 解析http返回数据
     * 
     * @Title readHttpList
     * @author 于国帅
     * @date 2018年5月10日 下午4:44:58
     * @param url
     * @return List<List<String>>
     */
    public static List<List<String>> readHttpList(String url) {
        String content = HttpUtil.getString(url);
        StringReader stringReader = new StringReader(content);
        return readList(stringReader);
    }

    /**
     * 解析文件返回数据
     * 
     * @Title readFileList
     * @author 于国帅
     * @date 2018年5月10日 下午4:45:24
     * @param fileUrl
     * @return List<List<String>>
     */
    public static List<List<String>> readFileList(String fileUrl) {
        File file = new File(fileUrl);
        FileReader reader = null;
        try {
            reader = new FileReader(file);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        return readList(reader);
    }

//    /**
//     * 
//     * @Title readList
//     * @author 于国帅
//     * @date 2018年5月5日 下午2:41:34
//     * @param filePath
//     * @param rowElementName
//     * @return List<List<String>>
//     */
//    public static List<List<String>> readHttpList(String url) {
//        List<List<String>> dataList = new ArrayList<>();
//        List<String> rowList = null;
//        String content = HttpUtil.getString(url);
//        if (isJsonObject(content)) {
//            JSONObject obj = JSON.parseObject(content);
//            if (MapUtils.isNotEmpty(obj)) {
//                for (Entry<String, Object> map : obj.entrySet()) {
//                    rowList = new ArrayList<>();
//                    rowList.add(String.valueOf(map.getValue()));
//                }
//                dataList.add(rowList);
//            }
//        } else {
//            JSONArray arr = JSON.parseArray(content);
//            if (CollectionUtils.isNotEmpty(arr)) {
//                for (int i = 0, len = arr.size(); i < len; i++) {
//                    rowList = new ArrayList<>();
//                    rowList.add(arr.getString(i));
//                    dataList.add(rowList);
//                }
//            }
//        }
//        return dataList;
//    }
//
//    /**
//     * json array每条作为一个json增加 ，jsonobject 作为一张表，里面的arr当做json字符串存入进去
//     * 
//     * @param filePath
//     * @return
//     */
//    public static Map<String, Object> readHttpMap(String url) {
//        try {
//            // 先发送请求获取对应的http数据
//            String content = HttpUtil.getString(url);
//            if (isJsonObject(content)) {
//                JSONObject obj = JSON.parseObject(content);
//                return obj.getInnerMap();
//            } else {
//                JSONArray arr = JSON.parseArray(content);
//                // jsonArray 解析为默认的字符串 一条条的插入
//                return (Map<String, Object>) new HashMap<String, Object>().put("json1", "");
//            }
//        } catch (Exception e) {
//            log.error("readMap", e);
//            return null;
//        }
//    }
//
    // 判断是否为jsonObject
    private static boolean isJsonObject(String content) {
        int arrLen = content.indexOf("[");
        int objLen = content.indexOf("{");
        if (objLen > arrLen) // 判断两者谁先出现，{先出现认为不是JsonObject
            return false;
        else
            return true;
    }

    // 判断是否为jsonObject
    private static boolean isJsonObject(Reader reader) {
        JSONReader jsonReader = new JSONReader(reader);
        try {
            jsonReader.startObject(); // 能够解析第一个不报错，证明就是JsonReader
            String key = jsonReader.readString();
            jsonReader.endObject();
            return true;
        } catch (Exception e) {
            return false;
        }
    }
//
//    public static void main(String[] args) {
//        String content = "{ { [";
//        int arrLen = content.indexOf("[");
//        int objLen = content.indexOf("{");
//        System.out.println(arrLen);
//        System.out.println(objLen);
//    }
}
